package com.hlm.transparent.core.check;


import io.netty.buffer.ByteBuf;

import java.util.Arrays;


/**
 * @program:transparent
 * @description:检查CJT188协议
 * @author: xinY
 **/
public class CJT188Check {
    private final static int addrLength = 7 ;
    public static boolean check(ByteBuf byteBuf,ByteBuf commandBuf){
        // 获取起始位置
        int start = -1 ;
        for (int i = 0; i < byteBuf.readableBytes(); i++) {
            // 跳过前导
            if( 0x68 == byteBuf.getByte(i) ){
                start = i ;
                break;
            }
        }
        // mac_addr
        byte[] addr = new byte[addrLength];
        for (int i = 0; i < addr.length; i++) {
            addr[i] = byteBuf.getByte(start + 2 + i);
        }
        byte[] commandAddr = new byte[addrLength];
        for (int i = 0 ; i < addr.length ; i ++){
            commandAddr[i] = commandBuf.getByte(i+2);
        }
        // 校验和
        int sum = 0 ;
        for (int i = start ; i < byteBuf.readableBytes() - 2 ; i++) {
            sum = sum + byteBuf.getByte(i);
//            System.out.println("第"+i+"个byte"+ HexUtil.toHexString(byteBuf.getByte(i)));
        }
//        System.out.println(sum % 256+"校验和");
        // 数据长度
        int dataLen = byteBuf.getByte(start + 3 + addrLength);
        int len = byteBuf.readableBytes();
        // 结束符
        int stop = byteBuf.getByte(len -1);
        // 数据标识
        byte DI0 = byteBuf.getByte(start + 2 + addrLength + 2);
        byte DI1 = byteBuf.getByte(start + 2 + addrLength + 3);
        // 序列号
        byte SER = byteBuf.getByte(start + 2 + addrLength + 4);

        if (start < 0){return false;}
        if (stop != 0x16 ){return false;}
        try{
            if (!Arrays.equals(addr,commandAddr)){throw new RuntimeException("表地址错误");}
            if (sum%256  != byteBuf.getByte(byteBuf.readableBytes()-2)){throw new RuntimeException("校验和错误");}
            if (len != start + 2 + addrLength + 2 + dataLen + 2){throw new RuntimeException("长度错误");}
            if (DI0 != commandBuf.getByte(11)){throw new RuntimeException("数据标识错误");}
            if (DI1 != commandBuf.getByte(12)){throw new RuntimeException("数据标识错误");}
            if (SER != commandBuf.getByte(13)){throw new RuntimeException("序列号错误");}
            return true;
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
        //68 为帧起始符 68H   下标为i
        //20 为仪表类型 T        i+1
        //51 为地址A0           i+2
        //21 为地址A1
        //31 为地址A2
        //17 为地址A3（A0、A1、A2、A3为读到的热量表的表号，从低位到高位）
        //00 为地址A4
        //11 为地址A5
        //11 为地址A6           i+8



        //81 为控制码 C
        //2E 为数据长度域 L（1F 90 12 00 00 00 00 05 00 00 00 00 05 00 00 00 00 14 00 00 00 00 35 19 00 00 00 2C 76 30 00 68 30 00 73 02 00 32 41 11 12 09 07 20 04 00共计2E个字符）
        //1F 为数据标识DI0
        //90 为数据标识DI1
        //12 为序列号SER
        //00 00 00 00 为当前冷量，05 为当前冷量单位代号表示kWh（表1）
        //12 43 00 00 为当前热量，05 为当前热量单位代号表示kWh（表1）43.21kwh
        //00 00 00 00 为热功率，14 为热功率单位代号表示W（表1）
        //00 00 00 00 为瞬时流量，35 为瞬时流量单位代号表示m³/h（表1）
        //19 00 00 00 为累计流量，2C 为累计流量单位代号表示m³（表1） 0.19
        //76 30 00 为供水温度0030.76℃
        //68 30 00 为回水温度0030.68℃
        //73 02 00 为累计工作时间000273小时
        //32 41 11 12 09 07 20 为实时时间2007年09月12日11时41分32秒
        //04 00 为状态字（具体定义见表2、表3）电池电压欠压，流量传感器正常，进回水温度传感器正常，积分仪正常
        //E9 为校验码 CS（68 20 51 21 31 17 00 11 11 81 2E 1F 90 12 00 00 00 00 05 00 00 00 00 05 00 00 00 00 14 00 00 00 00 35 19 00 00 00 2C 76 30 00 68 30 00 73 02 00 32 41 11 12 09 07 20 04 00进行二进制算术累加，不计超过FFH的溢出值）

        //


        //16 为结束符 16H

    }

}
